

\paragraph{下载仿真器文件。}
请从网页上下载 \texttt{Labsetup.zip} 文件，解压缩后会得到仿真器文件。这些仿真器文件存储在 \path{Labsetup/emulator_*} 文件夹中。对于 AMD64 机器，文件夹名为 \texttt{emulator\_NN}；对于 Apple 硅芯片机器，则为 \texttt{emulator\_arm\_NN}。数字 \texttt{NN} 表示区块链网络上的节点数量。如果虚拟机的内存小于 4GB，建议学生选择较小的版本。


要运行仿真器，我们只需要这些容器文件。这些文件是由 \path{Labsetup/emulator_code} 文件夹中的 Python 代码生成的。除非你想修改仿真器文件，否则无需运行该代码（需要从 GitHub 安装 SEED Emulator 库才能运行此代码）。希望修改仿真器的老师可以修改 Python 代码并生成自己的仿真器文件。

为了简化操作，在仿真器内部运行的区块链使用的是 Proof-of-Authority （PoA）共识协议，而不是在 MAINET 中使用的 Proof-of-Stake 协议。实验中的活动不依赖于任何特定共识协议。

\paragraph{启动仿真器。}
进入 \texttt{emulator} 文件夹，并运行以下 docker 命令以构建和启动容器。下面列出的命令是在 SEED VM 上创建的别名。如果您不是使用 SEED VM，可以使用原始命令。

\begin{lstlisting}
$ dcbuild       # 别名为: docker-compose build
$ dcup          # 别名为: docker-compose up
\end{lstlisting}

我们建议您在提供的 SEED Ubuntu 20.04 虚拟机中运行仿真器，但在安装了 docker 软件的普通 Ubuntu 20.04 操作系统上进行操作也不会有问题。对于较新的操作系统版本，\texttt{docker-compose} 命令已被集成到 \texttt{docker} 命令中，您可以使用 \texttt{"docker compose"} 替代 \texttt{docker-compose} 运行它。读者可以从
\href{https://github.com/seed-labs/seed-labs/blob/master/manuals/docker/SEEDManual-Container.md}{\underline{此链接}}找到 docker 手册。如果您是首次使用容器设置 SEED 实验环境，阅读用户手册非常重要。

所有容器都在后台运行。要对容器执行命令，我们通常需要在该容器上获取一个 shell。首先，我们需要使用 \texttt{docker ps} 命令来找到容器的 ID，然后使用 \texttt{docker exec} 在该容器上启动一个 shell。我们在 \texttt{.bashrc} 文件中为此创建了别名。

\begin{lstlisting}
$ dockps        // 别名为: docker ps --format "{{.ID}}  {{.Names}}"
$ docksh <id>   // 别名为: docker exec -it <id> /bin/bash

// 以下示例说明如何在 hostC 上获取 shell
$ dockps
b1004832e275  hostA-10.9.0.5
0af4ea7a3e2e  hostB-10.9.0.6
9652715c8e0a  hostC-10.9.0.7

$ docksh 96
root@9652715c8e0a:/#

// 注意：如果 docker 命令需要容器 ID，不需要输入完整的 ID，
//      输入前面的一部分就可以了，只要能唯一匹配一个 ID 就行。
\end{lstlisting}

如果您在设置实验环境时遇到问题，请阅读手册中的``常见问题''部分以获取解决方案。

\paragraph{停止仿真器。}
要停止仿真器，我们只需停止所有容器。我们可以回到运行 \texttt{"docker-compose up"} 命令的终端中，输入 \texttt{Ctrl-C}。这将停止所有容器但不会删除它们，即容器中的数据仍然保留，并可以通过再次运行 \texttt{"docker-compose up"} 来恢复容器的运行。如果我们想要删除它们，则可以运行 \texttt{"docker-compose down"} 命令。另一种方法是打开一个不同的终端（但仍处在 \texttt{emulator} 文件夹中），直接运行该命令。这将停止并删除所有容器。

\begin{lstlisting}
$ dcdown        # 别名为: docker-compose down
\end{lstlisting}
